package com.ruoyi.controller;

import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.ip.IpUtils;
import com.ruoyi.entity.*;
import com.ruoyi.service.UserOrderService;
import com.ruoyi.service.VerUserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@RestController
@Tag(name = "web用户信息管理", description = "提供用户信息相关操作接口")
@RequestMapping("/api/authWeb")
public class VerUserController extends BaseController {
    @Autowired
    private VerUserService verUserService;

    @Autowired
    private UserOrderService userOrderService;

    /**
     * 修改用户昵称和性别
     */
    @PutMapping("/info")
    @Operation(
            summary = "更新用户信息",
            description = "更新用户的昵称和性别信息"
    )
    public AjaxResult updateUserInfo(@RequestBody UserInfoUpdateRequest request) {
        int result = verUserService.updateNickNameAndGender(
                request.getUserId(),
                request.getNickName(),
                request.getGender()
        );
        if (result > 0) {
            return AjaxResult.success("更新成功");
        } else {
            return AjaxResult.error("更新失败");
        }
    }

    /**
     * 修改密码接口
     *
     * @param changePasswordDTO 密码修改请求
     * @return 操作结果
     */
    @PostMapping("/changePasswords")
    @Operation(summary = "修改密码", description = "")
    public Map<String, Object> changePassword(@RequestBody ChangePasswordDto changePasswordDTO) {
        Map<String, Object> result = new HashMap<>();

        try {
            boolean success = verUserService.changePassword(changePasswordDTO);
            if (success) {
                result.put("code", 200);
                result.put("msg", "密码修改成功");
            } else {
                result.put("code", 500);
                result.put("msg", "密码修改失败");
            }
        } catch (Exception e) {
            result.put("code", 500);
            result.put("msg", e.getMessage());
        }

        return result;
    }

    /**
     * 用户注册
     */
    @PostMapping("/register")
    @Operation(summary = "用户注册", description = "")
    public AjaxResult register(@Validated @RequestBody RegisterDto registerDto) {
        try {
            // 1. 记录注册请求日志
            log.info("用户注册请求：邮箱={}", maskEmail(registerDto.getEmail())); // 邮箱脱敏，避免敏感信息泄露

            // 2. 调用服务层注册逻辑
            verUserService.register(registerDto);

            // 3. 若依标准返回格式：成功状态+提示信息
            return AjaxResult.success("注册成功，请登录");
        } catch (Exception e) {
            // 4. 异常处理
            log.error("用户注册失败：邮箱={}，原因={}", maskEmail(registerDto.getEmail()), e.getMessage(), e);
            return AjaxResult.error(e.getMessage()); // 如邮箱已注册，直接返回异常信息
        }
    }

    /**
     * 用户登录
     */
    @PostMapping("/login")
    @Operation(summary = "用户登录", description = "校验用户身份，返回登录Token和基本信息")
    public AjaxResult login(@Validated @RequestBody LoginDto loginDto, HttpServletRequest request) {
        try {
            // 1. 获取客户端IP地址
            String ipAddr = IpUtils.getIpAddr(request);
            log.info("用户登录请求：邮箱={}，IP={}", maskEmail(loginDto.getEmail()), ipAddr); // 记录登录IP

            // 2. 调用服务层登录逻辑
            LoginVo loginVo = verUserService.login(loginDto, ipAddr);

            // 3. 记录登录成功日志
            log.info("用户登录成功：邮箱={}，用户ID={}，IP={}",
                    maskEmail(loginDto.getEmail()), loginVo.getUserId(), ipAddr);

            // 4. 若依标准返回格式：成功状态+业务数据
            return AjaxResult.success("登录成功", loginVo);
        } catch (Exception e) {
            // 5. 异常处理（登录失败日志：包含IP，便于排查恶意登录）
            log.error("用户登录失败：邮箱={}，IP={}，原因={}",
                    maskEmail(loginDto.getEmail()), IpUtils.getIpAddr(request), e.getMessage(), e);
            return AjaxResult.error(e.getMessage()); // 如邮箱密码错误、账号停用 直接返回
        }
    }

    /**
     * 辅助方法：邮箱脱敏
     */
    private String maskEmail(String email) {
        if (email == null || !email.contains("@")) {
            return email;
        }
        String[] parts = email.split("@");
        String prefix = parts[0];
        if (prefix.length() <= 2) {
            return prefix.charAt(0) + "****@" + parts[1]; // 前缀长度≤2：如12@qq.com → 1****@qq.com
        } else {
            return prefix.charAt(0) + "****" + prefix.charAt(prefix.length() - 1) + "@" + parts[1]; // 前缀长度>2：如123456@qq.com → 1****6@qq.com
        }
    }

    //    @PostMapping("/login")
//    @Operation(summary = "用户登录", description = "")
//    public AjaxResult login(@Validated @RequestBody LoginDto loginDto, HttpServletRequest request) {
//        try {
//            // 1. 获取客户端IP地址
//            String ipAddr = IpUtils.getIpAddr(request);
//            log.info("用户登录请求：邮箱={}，IP={}", maskEmail(loginDto.getEmail()), ipAddr);
//
//            // 2. 调用服务层登录逻辑（获取用户基本信息）
//            LoginVo loginVo = verUserService.login(loginDto, ipAddr);
//            Long userId = loginVo.getUserId(); // 从登录结果中获取用户ID
//
//            // 3. 登录成功后，查询该用户的订单列表（默认查询全部状态订单）
//            List<UserOrderDto> userOrders = userOrderService.getUserOrderList(userId,null);
//            log.info("用户订单查询完成：用户ID={}，订单数量={}", userId, userOrders.size());
//
//            // 4. 记录登录成功日志
//            log.info("用户登录成功：邮箱={}，用户ID={}，IP={}",
//                    maskEmail(loginDto.getEmail()), userId, ipAddr);
//
//            // 5. 构建包含登录信息和订单列表的返回结果
//            LoginWithOrderVo result = new LoginWithOrderVo();
//            result.setLoginInfo(loginVo);       // 登录信息（token、用户基本信息等）
//            result.setOrderList(userOrders);    // 订单列表
//
//            return AjaxResult.success("登录成功", result);
//        } catch (Exception e) {
//            // 6. 异常处理
//            log.error("用户登录失败：邮箱={}，IP={}，原因={}",
//                    maskEmail(loginDto.getEmail()), IpUtils.getIpAddr(request), e.getMessage(), e);
//            return AjaxResult.error(e.getMessage());
//        }
//    }
}
